#ifndef DOCKWIDGETMANAGER_H
#define DOCKWIDGETMANAGER_H

#include <QMainWindow>
#include <QMap>
#include <QMdiSubWindow>
#include "CameraPluginInterface.h"

namespace Ui { class DockWidgetManager; }

/**
 * @brief DockWidgetManager类 - 管理应用程序的停靠窗口、菜单和图形显示窗口
 * 
 * 该类负责维护应用程序的整体布局，包括停靠窗口的管理、菜单栏的处理以及图形显示区域的控制。
 * 它提供了注册和管理各种界面元素的接口，使插件能够与主界面进行交互。
 */
class DockWidgetManager : public QMainWindow
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数 - 创建DockWidgetManager实例
     * @param parent 父窗口组件
     */
    explicit DockWidgetManager(QWidget *parent = nullptr);
    
    /**
     * @brief 析构函数 - 清理资源
     */
    ~DockWidgetManager();

    /**
     * @brief 初始化工作区，设置dock widget布局
     * 
     * 配置所有停靠窗口的初始位置和大小比例，建立应用程序的基本布局结构。
     */
    void initWorkSpace();
    
    /**
     * @brief 初始化dock标题栏
     * 
     * 为所有停靠窗口设置自定义标题栏，添加标题显示和控制按钮。
     */
    void initDockTitle();
    
    /**
     * @brief 获取特定类型的dock widget
     * @param type 要获取的停靠窗口类型
     * @return 对应的QDockWidget指针，若类型无效则返回nullptr
     */
    QDockWidget* getDockWidget(DockWidgetType type) const;
    
    /**
     * @brief 获取菜单栏
     * @return 主窗口的菜单栏指针
     */
    QMenuBar* menuBar() const;
    
    /**
     * @brief 注册widget到指定的QDockWidget
     * @param type 目标停靠窗口类型
     * @param widget 要注册的窗口组件
     * @return 注册是否成功
     */
    bool registerWidgetToDock(DockWidgetType type, QWidget *widget);
    
    /**
     * @brief 注册菜单项到主窗口（重载1）
     * 
     * 将菜单项或子菜单添加到菜单栏或指定的子菜单中。
     * 
     * @param menuIndex 目标菜单索引，-1表示添加到菜单栏末尾
     * @param menuObject 要添加的QMenu或QAction对象
     */
    void onRegisterMenuItem(int menuIndex, QObject *menuObject);

    /**
     * @brief 注册菜单项到主窗口（重载2）
     * 
     * 根据索引路径在菜单层次结构中创建或查找菜单位置，并添加新的菜单项。
     * 菜单项点击时会显示指定的对话框。
     * 
     * @param indexs 菜单索引路径向量，每一层的索引值
     * @param title 菜单项显示的文本
     * @param pActionWidget 点击菜单项时显示的对话框
     */
    void onRegisterMenuItem(const QVector<int> &indexs, const QString &title, QDialog *pActionWidget);

    /**
     * @brief 注册菜单项到主窗口（重载3）
     * @param menuIndex 菜单索引，表示菜单项的位置
     * @param title 菜单名字
     * @return 菜单对象
     */
     QMenu* onRegisterMenuItem(int menuIndex, const QString &title);
    
    /**
     * @brief 注册widget到图形显示区域
     * 
     * 将图形显示组件添加到MDI区域，并建立GUID到子窗口的映射。
     * 
     * @param graphicsGuid 图形窗口的唯一标识符
     * @param titleString 图形窗口的标题
     * @param pWidget 要显示的图形组件
     */
    void registerGraphicsDisplayWidget(const QString& graphicsGuid, const QString& titleString, QWidget *pWidget);
    
    /**
     * @brief 注销图形显示窗口
     * 
     * 从MDI区域中移除指定GUID的图形显示窗口，并更新内部映射。
     * 
     * @param graphicsGuid 要注销的图形窗口标识符
     */
    void unregisterGraphicsDisplayWidget(const QString& graphicsGuid);
    
    /**
     * @brief 切换到指定的图形显示窗口
     * 
     * 激活并显示具有指定GUID的图形显示窗口。
     * 
     * @param graphicsGuid 目标图形窗口的标识符
     */
    void switchToGraphicsDisplayWidget(const QString& graphicsGuid);

signals:
    /**
     * @brief 当图形显示窗口切换时发出信号
     * @param graphicsGuid 当前激活的图形窗口标识符
     */
    void graphicsDisplayWidgetSwitched(const QString& graphicsGuid);
    
    /**
     * @brief 当图形显示窗口关闭时发出信号
     * @param graphicsGuid 被关闭的图形窗口标识符
     */
    void graphicsDisplayWidgetClosed(const QString& graphicsGuid);

private:
    // UI对象
    Ui::DockWidgetManager *ui;
    
    /**
     * @brief 存储dock widget的映射
     * 
     * 保存DockWidgetType到QDockWidget指针的映射关系，用于快速查找特定类型的停靠窗口。
     */
    QMap<DockWidgetType, QDockWidget*> m_dockWidgetsMap;
    
    /**
     * @brief 图形显示子窗口映射表
     * 
     * 保存图形窗口GUID到QMdiSubWindow指针的映射，用于管理多个图形显示窗口。
     */
    QMap<QString, QMdiSubWindow*> m_GraphicsSubWindowMap;
    
    /**
     * @brief 当前选中的图像GUID
     * 
     * 记录当前活动的图形显示窗口的唯一标识符。
     */
    QString m_currentSelectedGuid;
};


#endif // DOCKWIDGETMANAGER_H
